package base.collection_demo.demo01;

import org.junit.Test;

import java.util.*;

public class Client {

    @Test
    public void testCase1(){
        Collection<String> coll = new ArrayList<>();
        coll.add("张三");
        coll.add("李四");
        coll.add("王五");

        //1. jdk 1.8 集合的遍历方式
        coll.forEach(x->{
            System.out.println(x);
        });
        System.out.println("-----------------1-------------------");

        // 2.通过迭代器遍历
        Iterator<String> iterator = coll.iterator();
        //迭代器的第一种遍历方式
//        while (iterator.hasNext()){
//            System.out.println(iterator.next());
//        }

//        iterator.forEachRemaining(x-> {
//            System.out.println(x);
//        });

        for (String s: coll){
            System.out.println(s);
        }

        System.out.println("-----------------2-------------------");
        ArrayList<String> list = new ArrayList<>();
        list.add("aa");
        list.add(null);
        list.add(null);
        list.add("aa");
        for (String s : list) {
            System.out.println(s);
        }

        System.out.println("-----------------3 Set中仅有一个 null 对象-------------------");
        HashSet<String> set = new HashSet<>();
        set.add("aa");
        set.add(null);
        set.add(null);
        set.add("aa");
        for (String s : set) {
            System.out.println(s);
        }

        System.out.println("-----------------4 Map 中key可以是null， value是最后一次赋值-------------------");
        HashMap<String, String> map = new HashMap<>();
        map.put("aa", "aa");
        map.put(null, "bb");
        map.put(null, "cc");
        map.put("aa", "dd");

        map.forEach((x,y)->{
            System.out.println(x+":"+y);
        });

    }

    @Test
    public void testCase2(){
        ArrayList<String> list = new ArrayList<>();
        list.add("aa");
        list.add("bb");
        list.add("cc");

        //正确的删除方式
//        Iterator<String> iterator = list.iterator();
//        while (iterator.hasNext()) {
//            iterator.next();
//            iterator.remove();
//        }

        Iterator<String> iterator = list.iterator();
        list.remove("aa");

        for (String s : list) {
            iterator.next();
            iterator.remove();
        }

        System.out.println(list);

    }

    @Test
    public void testCase3(){
        ArrayList<String> list = new ArrayList<>();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("dd");
        list.add("aa");
        // 增强for-each也是删不掉的,内部还是调用了list.remove(s)
//        for (String s : list) {
//            list.remove(s);
//        }

        // 普通for循环删不掉，错位
//        for (int i = 0; i < list.size(); i++) {
//            String remove = list.remove(0);
//            System.out.println(remove);
//        }

        // 这种看上去是通过迭代器删除集合，也是不行的，犯了通过两个迭代器对象交叉迭代错误
        // for-each循环使用了一个迭代器Iterator， 我们自己list.iterator()产生的Iterator
//        Iterator<String> iterator = list.iterator();
//        for (String s : list) {
//            String next = iterator.next();
//            iterator.remove();
//        }

        // 迭代器遍历删除是可行的
//        Iterator<String> iterator = list.iterator();
//        while (iterator.hasNext()) {
//            String next = iterator.next();
//            System.out.println("移除下一个："+next);
//            iterator.remove();
//        }

        //普通for循环逆序删除是可行的(正序不行，推荐逆序，性能高，不会遗漏遍历的对象，少移位数组)
//        for (int i = list.size()-1; i >=0 ; i--) {
//            if (i==2) {
//                String remove = list.remove(i);
//                System.out.println(remove);
//            }
//        }
        // 可行
//        list.removeIf(x->{
//            return x=="aa";
//        });
        list.removeIf(x->x=="aa");

        System.out.println(list);
    }
}
